#include "Common.hpp"
#include "Log.hpp"
#include <csignal>
#include <cstdlib>
#include <unistd.h>
#include <fcntl.h>
// 这里实现的守护进程，也就是将当前的进程放在后台运行
// 实现思路：
// 创建一个子进程，父进程直接退出了
// 这个子进程新开一个会话，也就是脱离终端
// 然后就是更改工作目录，不依赖于特定的目录，一般是根目录
// 然后就是重定向三个标准文件描述符
using namespace LogModule;
const std::string dev = "/dev/null";

void Daemon(int nochdir, int noclose) {
    signal(SIGPIPE, SIG_IGN); // 这里触发的是向关闭的文件描述符写内容时会发出的信号
    signal(SIGCHLD, SIG_IGN);

    if(fork() > 0) {
        exit(0);
    }
    setsid();
    if(nochdir == 0) {
        chdir("/");
    }
    if(noclose == 0) {
        int fd = ::open(dev.c_str(), O_RDWR);
        if(fd < 0) {
            LOG(LogLevel::FATAL) << "open " << dev << " error";
            exit(OPEN_ERR);
        }else {
            dup2(fd, 0);
            dup2(fd, 1);
            dup2(fd, 2);
            close(fd);
        }
    }
}